import logging
import os
from common.readConfig import read_conf
from conf.constant import cons
from logging.handlers import TimedRotatingFileHandler

class MyLog(object):
    def __new__(cls, *args, **kwargs):
        '''
        日志器Logger  提供了应用程序可一直使用的接口
        处理器Handler 将logger创建的日志记录发送到合适的目的输出
        过滤器Filter  提供了更细粒度的控制工具来决定输出哪条日志记录，丢弃哪条日志记录
        格式器Formatter 决定日志记录的最终输出格式
        简单点说就是：日志器（logger）是入口，真正干活儿的是处理器（handler），处理器（handler）还可以通过过滤器（filter）和格式器（formatter）对要输出的日志内容做过滤和格式化等处理操作
        '''

        # 读取日志等级
        log_level = read_conf.get('log', 'log_level')
        # 读取输出到控制台的等级
        sh_level = read_conf.get('log', 'sh_level')
        # 读取输出到文件的等级
        fh_level = read_conf.get('log', 'fh_level')
        # 日志文件的路径
        log_filename = cons.date_file2 + '.log'
        log_file_path = os.path.join(cons.LOG_PATH, log_filename)
        # 一：创建日志收集器对象,日志器实例
        logger = logging.getLogger()
        logger.setLevel(log_level)       # 设置日志级别
        # 这里进行判断，如果logger.handlers列表为空，则添加，否则，直接去写日志
        if not logger.handlers:
            # 二：创建日志输出渠道，设置处理器，输出到控制台，控制台处理器实例sh，输出到文件，文件处理器实例fh
            sh = logging.StreamHandler()
            sh.setLevel(sh_level)
            # 日志轮转
            # 按时间间隔轮转
            fh = TimedRotatingFileHandler(filename=log_file_path, when='D', interval=1,backupCount=2, encoding='utf8')
            # fh = logging.FileHandler(log_file_path, encoding='utf8')
            fh.setLevel(fh_level)
            # 三：设置日志输出格式
            # fot = '%(asctime)s - %(name)s - %(levelname)s - %(process)s - %(processName)s - %(thread)s - %(threadName)s - %(filename)s - %(funcName)s:%(lineno)d - %(pathname)s - %(message)s'
            fot = '%(levelname)s - %(asctime)s - %(name)s - %(filename)s - %(funcName)s:%(lineno)d - %(message)s'
            formatter = logging.Formatter(fot)  # 创建日志输出格式对象
            # 为handler指定日志输出格式
            sh.setFormatter(formatter)
            fh.setFormatter(formatter)
            # 四：为日志器添加日志处理器
            logger.addHandler(sh)
            logger.addHandler(fh)
            # 五：将日志收集器进行返回
            return logger



# 创建一个日志收集器对象
log = MyLog()


# log.debug('---debug等级日志，一般用于调试')
# log.info('---info等级日志，常规信息的输出')
# log.warning('---warning等级日志，警告信息')
# log.error('---error等级日志，错误信息')
# log.critical('---critical等级日志，严重错误，程序要崩溃')